/******************************************************************************* MPLAB Harmony Application Source File Company: Microchip Technology Inc. File Name: app.c Summary: This file contains the source code for the MPLAB Harmony application. Description: This file contains the source code for the MPLAB Harmony application. It implements the logic of the application's state machine and it may call API routines of other MPLAB Harmony modules in the system, such as drivers, system services, and middleware. However, it does not call any of the system interfaces (such as the "Initialize" and "Tasks" functions) of any of the modules in the system or make any assumptions about when those functions are called. That is the responsibility of the configuration-specific system files. *******************************************************************************/ // DOM-IGNORE-BEGIN /******************************************************************************* * Copyright (C) 2018 Microchip Technology Inc. and its subsidiaries. * * Subject to your compliance with these terms, you may use Microchip software * and any derivatives exclusively with Microchip products. It is your * responsibility to comply with third party license terms applicable to your * use of third party software (including open source software) that may * accompany Microchip software. * * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A * PARTICULAR PURPOSE. * * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE * FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. *******************************************************************************/ // DOM-IGNORE-END // ***************************************************************************** // ***************************************************************************** // Section: Included Files // ***************************************************************************** // ***************************************************************************** #include <string.h> #include "app.h" #include "user.h" #include "definitions.h" #include "1lcd_lib_XC32.h" APP_DATA appData; char Buf[16]; char Buf1[32]; char buf[16]; int ix = 0; char* str; char data; char Japan[] = "Japan"; char America[] = "America"; char UK[] = "U.K."; char France[] = "France"; char Tokyo[] = "Tokyo"; char Washinton[] = "Washinton"; char London[] = "London"; char Paris[] = "Paris"; char Pardon[] = "Pardon ?"; static const char Hellow_World[] = "Hellow World !!\r\n"; int delay_Clock = 200000000; //システムクロック:200MHz void delay_us(volatile unsigned int usec) //1μsec遅延 { volatile int count; count = (int)(delay_Clock/20000000)*usec; do //実測 at 200MH (Clock=200000000) { //delay_us(1000):1000.4μsec delay_us(100):100.6μsec delay_us(10):10.5μsec delay_us(1):1.5μsec asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); count--; }while(count != 0); } void delay_ms(volatile unsigned int msec) //1msec遅延 { volatile unsigned int i; //実測:at200MH (Clock=200000000)//delay_ms(1): 1.0006msec delay_ms(100):100.04msec for(i=0; i<msec; i++) delay_us(1000); } void my_Initialize ( void ) { lcd_init(); // LCD初期化 lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF lcd_clear(); lcd_cmd(0x80); //1目の先頭へ sprintf(Buf1,"UART Harmony ");// lcd_str(Buf1); //液晶表示 lcd_cmd(0xC0); //2行目の先頭へ sprintf(Buf1," Harmony V3 "); // lcd_str(Buf1); // 開始メッセージ1行目表示 delay_ms(2000); } // ***************************************************************************** // ***************************************************************************** // Section: Application Callback Functions // ***************************************************************************** // ***************************************************************************** static void APP_USARTBufferEventHandler( //送受信バッファーのデータ処理完了に係るコールバック関数 DRV_USART_BUFFER_EVENT bufferEvent, DRV_USART_BUFFER_HANDLE bufferHandle, uintptr_t context ) { switch(bufferEvent) { case DRV_USART_BUFFER_EVENT_COMPLETE: //処理が完了すると呼ばれる(イベントが発生する)。 以下の2つの場合がある //1. 送信バッファにあるデータがすべて排出され送信バッファが空になった場合 //2. 受信バッファが受信を完了した場合 appData.transferStatus = true; break; case DRV_USART_BUFFER_EVENT_ERROR: appData.state = APP_STATE_ERROR; break; default: break; } } // ***************************************************************************** // ***************************************************************************** // Section: Application Local Functions // ***************************************************************************** // ***************************************************************************** /* TODO: Add any necessary local functions. */ // ***************************************************************************** // ***************************************************************************** // Section: Application Initialization and State Machine Functions // ***************************************************************************** // ***************************************************************************** /******************************************************************************* Function: void APP_Initialize ( void ) Remarks: See prototype in app.h. */ void APP_Initialize ( void ) { /* Place the App state machine in its initial state. */ appData.state = APP_STATE_INIT; appData.transferStatus = false; appData.usartHandle = DRV_HANDLE_INVALID; appData.bufferHandle = DRV_USART_BUFFER_HANDLE_INVALID; } /****************************************************************************** Function: void APP_Tasks ( void ) Remarks: See prototype in app.h. */ void APP_Tasks ( void ) { /* Check the application's current state. */ switch ( appData.state ) { /* Application's initial state. */ case APP_STATE_INIT: //初期化ステート my_Initialize(); // appData.usartHandle = DRV_USART_Open(DRV_USART_INDEX_0, DRV_IO_INTENT_READWRITE); // //UARTのドライバーインスタンスを定義し、ドライバーハンドルを生成 if (appData.usartHandle != DRV_HANDLE_INVALID) //ハンドルが正常に生成された場合 { DRV_USART_BufferEventHandlerSet(appData.usartHandle, APP_USARTBufferEventHandler, 0); //コールバック関数APP_USARTBufferEventHandlerを設定 appData.state = APP_STATE_TRANSMIT_MESSAGE; } else //ハンドルが正常に生成されなかった場合 { appData.state = APP_STATE_ERROR; } break; case APP_STATE_TRANSMIT_MESSAGE: //PIC起動時に文字列送信 DRV_USART_WriteBufferAdd(appData.usartHandle, (void*)Hellow_World, sizeof(Hellow_World), &appData.bufferHandle); //文字列送信 if (appData.bufferHandle != DRV_USART_BUFFER_HANDLE_INVALID) //ハンドルの競合などがなくハンドル生成成功の場合 { appData.state = APP_STATE_WAIT_MESSAGE_TRANSFER_COMPLETE; } else { appData.state = APP_STATE_ERROR; } break; case APP_STATE_WAIT_MESSAGE_TRANSFER_COMPLETE: if(appData.transferStatus == true) //送信完了(送信バッファが空になるの)を待つ { appData.transferStatus = false; //フラグをfalseにセット appData.state = APP_STATE_RECEIVE_DATA; } break; case APP_STATE_RECEIVE_DATA: //受信 DRV_USART_ReadBufferAdd(appData.usartHandle, &data, sizeof(data), &appData.bufferHandle); //受信開始 //受信モードへ、受信バッファ受信待ち状態へ if (appData.bufferHandle != DRV_USART_BUFFER_HANDLE_INVALID) //ハンドルの競合などがなくハンドル生成成功の場合 { appData.state = APP_STATE_WAIT_RECEIVE_COMPLETE; } else { appData.state = APP_STATE_ERROR; } break; case APP_STATE_WAIT_RECEIVE_COMPLETE: //受信完了待ちステート if(appData.transferStatus == true) //受信バッファへのデータ受信が完了するのを待つ { appData.transferStatus = false; //フラグをfalseにセット buf[ix] = data; if(buf[ix] == '\r') // Enter キーが押された場合 { buf[ix] = '\0'; if(strcmp(buf,Japan) == 0)str = Tokyo; else if(strcmp(buf,America) == 0) str = Washinton; else if(strcmp(buf,UK) == 0) str = London; else if(strcmp(buf,France) == 0) str = Paris; else str = Pardon; ix = 0; sprintf(Buf,"%s\r\n",str); //改行追加 lcd_cmd(0x80); //1目の先頭へ sprintf(Buf1,"%s ",buf); lcd_str(Buf1); //液晶表示 lcd_cmd(0xC0); //2行目の先頭へ sprintf(Buf1,"%s ",str); lcd_str(Buf1); // 開始メッセージ1行目表示 appData.state = APP_STATE_TRANSMIT_DATA; } else //Enter キー以外が押された場合 { ix++; appData.state = APP_STATE_RECEIVE_DATA; //受信 } } break; case APP_STATE_TRANSMIT_DATA: //送信データ作成、データ送信ステート DRV_USART_WriteBufferAdd(appData.usartHandle, Buf, strlen(Buf), &appData.bufferHandle); //送信バッファーにデータに書き込み // DRV_USART_WriteBufferAdd(appData.usartHandle, Buf, sizeof(Buf), &appData.bufferHandle); // ←NG sizeof()だと時々 文字列の長さを誤認する if (appData.bufferHandle != DRV_USART_BUFFER_HANDLE_INVALID) //ハンドル生成成功の場合 { appData.state = APP_STATE_WAIT_TRANSMIT_COMPLETE; } else { appData.state = APP_STATE_ERROR; } break; case APP_STATE_WAIT_TRANSMIT_COMPLETE: // 送信完了待ち if(appData.transferStatus == true) //送信完了(送信バッファが空になるの)を待つ { appData.transferStatus = false; //フラグをfalseにセット appData.state = APP_STATE_RECEIVE_DATA; } break; case APP_STATE_ERROR: //正常動作の場合このステートは使用されない appData.state = APP_STATE_IDLE; break; case APP_STATE_IDLE: //正常動作の場合このステートは使用されない break; default: //正常動作の場合このステートは使用されない break; } } /******************************************************************************* End of File */